import myAxios from '@/utils/axios.js';

/**
 * @description: 获取商品分类列表
 * @param {*} params
 * @return {*}
 */
export const getProductCategoryList = function () {
    return myAxios({
        url: '/index/adapter',
        method: 'get',
    });
};

/**
 * @description: 获取指定商品详情
 * @param {string} proId 商品id
 * @return {*}
 */
export const getProInfoById = function (proId) {
    return myAxios({
        url: `/product/detail/${proId}`,
        method: 'get',
    });
};

/**
 * @description: 获取商品搜索数据
 * @param {*} data 查询参数
 * @return {*}
 */
export const searchProduct = function (data) {
    // 合并默认查询参数
    let defaultConfig = {
        page: 1,
        size: 12,
    };
    let allowedProperties = [
        'page',
        'size',
        'text',
        'brandids',
        'categoryids',
        'code',
        'casno',
        'lowerprice',
        'upperprice',
        'sort',
    ];
    let selectProperties = ['text', 'brandids', 'categoryids', 'code', 'casno'];
    let searchConfig = Object.assign(defaultConfig, checkSearchParams(allowedProperties, selectProperties, data));
    return myAxios({
        url: '/product/search',
        method: 'post',
        data: searchConfig,
    });
};
export const searchTip = function (data) {
    let defaultConfig = {
        brandids: [],
        categoryids: [],
        text: '',
    };
    let properties = ['brandids', 'categoryids', 'text'];

    return myAxios({
        url: '/product/searchtip',
        method: 'get',
        params: Object.assign(defaultConfig, checkSearchParams(properties, properties, data)),
    });
};

// 通用方法
/**
 * @description: 删除无效属性
 * @param {*} obj  查询参数对象
 * @param {*} allowedProperties 允许的属性列表
 * @return {*}
 */
function removeProperties(obj, allowedProperties) {
    // 遍历对象的属性
    for (const property in obj) {
        // 如果该属性不在允许列表中，删除它
        if (!allowedProperties.includes(property)) {
            delete obj[property];
        }
    }
    return obj;
}

/**
 * 检查对象是否包含指定的属性之一。
 *
 * @param {Object} obj - 被检查的对象。
 * @param {Array} properties - 属性名称的数组，用于检查对象是否包含这些属性之一。
 * @returns {boolean} - 如果对象包含至少一个指定的属性，则返回true；否则返回false。
 */
function hasAnyProperty(obj, properties) {
    // 遍历属性数组，检查每个属性是否存在于对象中
    for (const property of properties) {
        // 使用in运算符检查对象是否包含当前属性
        if (property in obj) {
            // 如果对象包含当前属性，则立即返回true
            return true;
        }
    }
    // 如果遍历完所有属性后都没有找到匹配的属性，则返回false
    return false;
}

/**
 * 检查查询参数是否符合允许的列表。
 * 该函数主要用于从数据对象中移除非允许列表中的属性，如果数据对象中包含选择列表中的任何属性，则返回处理后的对象。
 * 如果数据对象中不包含选择列表中的任何属性，则显示错误消息。
 *
 * @param {Array} allowList - 允许的参数列表。这是用于确定哪些属性应该保留在数据对象中的列表。
 * @param {Array} selectList - 选择的参数列表。这是用于检查数据对象是否包含任何指定属性的列表。
 * @param {Object} data - 待检查的查询参数对象。
 * @returns {Object|void} 如果数据对象包含选择列表中的任何属性，则返回移除非允许属性后的对象；否则不返回任何值。
 */
let checkSearchParams = (allowList, selectList, data) => {
    let paramsObj = removeProperties(data, allowList);
    if (hasAnyProperty(data, selectList)) {
        return paramsObj;
    } else {
        ElMessage.error('查询参数错误');
    }
};
